package com.lbb.springboot.util;

import com.lbb.springboot.entity.dto.ExcelData;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Map;

/**
 * excel导出工具
 * @author wzq
 * @since 2018-03-20
 */
public class ExcelExportUtils {

    /**
     * 导出excel
     * @param response
     * @param fileName
     * @param data
     * @throws Exception
     */
    public static void exportExcel(HttpServletResponse response, String contentType, String fileName, ExcelData data) {
        OutputStream out = null;
        // 创建工作薄
        SXSSFWorkbook swb = new SXSSFWorkbook(5000); // rowAccessWindowSize:内存中缓存记录数
        try {
            // 将数据写入工作薄
            writeExcel(swb, data);
            // 指定输出excel文件以及后缀格式
            // 生成xls（application/vnd.ms-excel）
            // 生成xlsx（"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"）
            response.setHeader("content-Type", contentType);
            // 设置文件名
            response.setHeader("Content-Disposition", "attachment;filename="+java.net.URLEncoder.encode(fileName, "UTF-8"));
            out = response.getOutputStream();
            swb.write(out);
            response.flushBuffer();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                try {
                    out.flush();
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 填充excel内容
     * @param swb
     * @param data
     * @throws Exception
     */
    private static void writeExcel(SXSSFWorkbook swb, ExcelData data) throws Exception {
        // 创建工作页签
        String sheetName = data.getSheetName();
        if (null == sheetName) {sheetName = "Sheet1";}
        SXSSFSheet sheet = swb.createSheet(sheetName);
        // 在索引0的位置创建行（最顶端的行）
        SXSSFRow row = sheet.createRow(0);
        // 设置列标题
        for (int i=0; i<data.getTitles().length; i++) {
            // 在第一行创建单元格
            SXSSFCell cell = row.createCell(i);
            // 设置单元格为字符串类型
            cell.setCellType(CellType.STRING);
            // 将内容填入单元格中
            cell.setCellValue(data.getTitles()[i]);
        }
        // 将业务数据填入excel
        for (int n = 0; n < data.getRows().size(); n++) {
            // 在表格第二行开始填入数据
            SXSSFRow rowData = sheet.createRow(n+1);
            Map<Integer, String> map = data.getRows().get(n);
            for (int i = 0; i < data.getTitles().length; i++) {
                SXSSFCell cellData = rowData.createCell(i);
                cellData.setCellType(CellType.STRING);
                cellData.setCellValue(StringUtils.isBlank(map.get(i))?"":map.get(i));
            }
        }
    }
}
